package com.lmf.juc.Lock.case4;

import org.junit.Test;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * 演示 HashSet() 线程不安全的解决方法：
 *      1.使用 CopyOnWriteArraySet<>() 集合，线程安全
 */
public class ThreadDemo3 {

    public static void main(String[] args) {
        /**
         * HashSet<>()：由于底层没有使用 Synchronized 关键字，
         *  所以在出现多线程高并发，同时去arrayList集合中，进行读取写入操作时，就会发生并发修改异常
         */
//        Set<String> set = new HashSet<>();

        /**
         * 解决办法：使用 CopyOnWriteArraySet<>() 集合，线程安全
         */
        Set<String> set = new CopyOnWriteArraySet<>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                String id = UUID.randomUUID().toString().substring(0,8);
                set.add(id);
                System.out.println(set);
            },String.valueOf(i)).start();
        }
    }

}
